Ogre的mesh和skeleton数据格式分析
这两天研究Ogre的骨骼动画,先从mesh和skeleton文件入手,了解一下,这两个文件记录了什么。就拿Orge里自带的ninja开刀,好歹也是人形的。
首先看一下skeleton文件,skeleton文件描述和记录了物体的骨骼和动画情况。
从上图可以得知,整个skeleton文件分成了三部分bones,bonehierarchy,animations。
1.bones部分描述了每一块骨头的具体情况:
从上图可知,其实一块骨头,实际上真正的有效数据仅是一个起始位置,和一个起始的转向。当然骨骼还包括骨骼的编号和名字这样的数据。
2.bonehierarchy,即骨骼的继承关系,描述了骨骼是怎么样组成骨架的。
至此skeleton文件已经完整的描述了一整个骨架。
3.animations动画集部分。动画集,由多个动画组成。 每个动画由一系列的track组成,每个track由一系列的Keyframe组成。一个track描述了单块骨头在每个keyframe所描述的时间点的位移和旋转。
上图显示名为"Attack1"的动作,时长为1s, 由多个track组成,其中一个track所表示的是名为"Join1"的骨头的运动情况。各种Keyframe表示在指示时间点的位移和旋转。
我们再来看看mesh文件。
<mesh>
<submeshes>
<submesh materail="Examples/Ninja" usesharedvertices="fase" use32bitindexes="fase" operationtype ="trangle_list">
<faces count="904">
<face v1="0" v2="1" v3="2"/>
..........................
</faces>
<geometry vertexcount="781">
<vertexbuffer positions="true" normals="true">
<vertex>
<position x="0" y="179.594" z="-16.0094" />
<normal x="1.66615e-008" y="0.160267" z="-0.987074" />
</vertex>
.....................................
</vertexbuffer>
<vertexbuffer texture_coord_dimensions_0="2" texture_coords="1">
<vertex>
<texcoord u="0.44849" v="0.141284" />
</vertex>
.......................
</vertexbuffer>
</geometry>
<boneassignments>
<vertexboneassignment vertexindex="0" boneindex="7" weight="1" />
<vertexboneassignment vertexindex="1" boneindex="7" weight="1" />
..................
</boneassignments>
</submeshes>
<skeletonlink name="ninja.skeleton" />
</mesh>
每个mesh由多个submesh组成,每个submesh由faces部分, geometry 部分,boneassignments部分组成。faces部分用 顶点索引描述了物体的每一个三角形面。geometry部分由两个vertexbuffer组成,第一个描述了每个顶点的坐标和法线,每二个描述了顶点的UV,boneassignments部分描述了每个顶点所附着的骨头组及权重。